package springbucks.util;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author wangyidi
 * @version V1.0
 * @Description 全局id
 * @date 2022/11/26 12:02 下午
 * @Copyright © 2022 中电金信-研究院
 */
@Component
public class GlobalIdUtil {

    private static final long BEGIN_TIMESTAMP = 1640995200L;
    /**
     * 序列号位数
     */
    private static final int COUNT_BITS = 32;

    @Resource
    private RedisUtil redisUtil;

    /**
     * @return long
     * @Description ① 1位，固定位；
     * ② 31位，用来记录时间戳（秒），接近69年；
     * ③ 32位，序列号，用来记录同一秒内产生的不同id；
     * @author wangyidi
     * @date 2022/11/26 12:07 下午
     * @Param [keyPrefix]
     **/
    public long nextID(String keyPrefix) {

        //1、生成时间戳
        LocalDateTime now = LocalDateTime.now();
        long nowScond = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowScond - BEGIN_TIMESTAMP;
        //2、生成序列号
        // 2.1 获取当前日期，精确到天
        String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        long count = redisUtil.incr("icr" + keyPrefix + ":" + date);

        //3、拼接字符串
        // 时间戳左移32位，然后 或 序列号，有1为1
        long ids = timestamp << COUNT_BITS | count;
        return ids;
    }
}
